home *** CD-ROM | disk | FTP | other *** search
- ;
- ; grafix --- cgagrafa.asm
- ;
- ; stuff to plot points fast in 8086 assembler (BLEECH!!!)
- ;
- ; Written 4/87 by Scott Snyder (ssnyder@romeo.caltech.edu or @citromeo.bitnet)
- ;
- ; Modified 5/29/87 by sss to allow for different memory models
- ;
-
- title cgagrafa
-
- include macros.ah
-
- sseg
- endss
-
- g_oddoff equ 02000h
- g_linsiz equ 80
-
- dseg
-
- ex g_drawbuf, dword
- ex g_pixbyte, word
- ex g_bitpix, word
- ex g_colormask, byte
- ex g_cmask_tbl, byte
- ex g_hicolormask, byte
- ex g_xor, word
- ex g_xcliplo, word
- ex g_xcliphi, word
- ex g_ycliplo, word
- ex g_ycliphi, word
-
- endds
-
- cseg _cgagrafa
-
- ; plot a point. ax = y; bl = c; cx = x;
-
- pBegin plot
-
- les si, g_drawbuf ; get address of buffer
- sar ax, 1 ; y /= 2
- jnc p1 ; add in offset if it was odd
- add si, g_oddoff
- p1: mov dx, g_linsiz ; y * g_linsiz
- mul dx
- add si, ax ; add to offset
- mov ax, cx ; x to AC (ohhh... what symmetry!)
- mov dx, 0
- div g_pixbyte
- add si, ax ; add quotient to offset (now complete)
- and bl, g_colormask ; get cmask
- mov bl, g_cmask_tbl[bx]
- mov cx, g_bitpix ; only works for bitpix = 0 or 1!
- dec cx
- shl dx, cl ; dx = mask shift count
- mov cx, dx
- mov dl, g_hicolormask ; get mask
- shr dl, cl ; shift it
- and bx, dx ; bx = cmask & mask
- mov al, es:[si] ; get image byte
- cmp g_xor, 0 ; xor mode?
- jne p2
- not dl ; no - (*ptr & ~mask) | (cmask & mask)
- and al, dl
- or al, bl
- jmp p3
- p2: xor al, bl ; yes - *ptr ^ (cmask & mask)
- p3: mov es:[si], al ; done!
- ret
-
- pEnd plot
-
- ;
- ; C interface for point plotter
- ;
- ; CGA_point(x, y, c)
- ;
-
- pBegin CGA_point
- push bp
- mov bp, sp
- push si
- push di
-
- mov ax, [bp+argbase+2]
- mov bx, [bp+argbase+4]
- mov cx, [bp+argbase]
- call plot
-
- pop di
- pop si
- mov sp, bp
- pop bp
- ret
-
- pEnd CGA_point
-
- ;
- ; write for pixels for circle drawing
- ;
- ; void CGA_write_pix(x1, y1, x2, y2, c)
- ;
-
- pBegin CGA_write_pix
-
- push bp
- mov bp, sp
- push si
- push di
-
- mov bx, [bp+argbase+8] ; bx = c (for plot)
- mov cx, [bp+argbase] ; cx = x1
- cmp cx, g_xcliplo ; check for clipping
- jb w2
- cmp cx, g_xcliphi
- ja w2
-
- mov ax, [bp+argbase+2] ; ax = y1
- cmp ax, g_ycliplo ; do clipping
- jb w1
- cmp ax, g_ycliphi
- ja w1
-
- push bx ; plot (x1, y1)
- push cx
- call plot
- pop cx
- pop bx
-
- w1: mov ax, [bp+argbase+6] ; ax = y2
- cmp ax, g_ycliplo
- jb w2
- cmp ax, g_ycliphi
- ja w2
-
- push bx ; plot (x1, y2)
- call plot
- pop bx
-
- w2: mov cx, [bp+argbase+4] ; cx = x2
- cmp cx, g_xcliplo
- jb w4
- cmp cx, g_xcliphi
- ja w4
-
- mov ax, [bp+argbase+2] ; ax = y1
- cmp ax, g_ycliplo ; do clipping
- jb w3
- cmp ax, g_ycliphi
- ja w3
-
- push bx ; plot (x2, y1)
- push cx
- call plot
- pop cx
- pop bx
-
- w3: mov ax, [bp+argbase+6] ; ax = y2
- cmp ax, g_ycliplo
- jb w4
- cmp ax, g_ycliphi
- ja w4
-
- call plot ; plot (x2, y2)
-
- w4: pop di
- pop si
- mov sp, bp
- pop bp
- ret
-
- pEnd CGA_write_pix
-
- df_ CGA_point
- df_ CGA_write_pix
-
- endcs _cgagrafa
-
- end
-